package com.h819.core.utils;

import com.h819.core.utils.date.MyDateUtilsExtend;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.log4j.Logger;
import org.joda.time.DateTime;

import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

/**
 * @Title: DateUtils.java
 * @Description: TODO(时间、日期工具类)
 * @author H819
 * @date 2010-3-4
 * @version V1.0
 */
public class MyDateUtils extends MyDateUtilsExtend {

	static Logger log = Logger.getLogger(MyDateUtils.class);

	/**
	 * 通过静态方法调用，不允许实例化
	 */
	private MyDateUtils() {

	}

	/**
	 * 日期增加天数。还有其他的增加和相减等日期（年、月、日、分钟、秒等）计算方法，详见 JodaTime。另外日期加减 commons 中也有相应方法
	 * 
	 * @param dt
	 *            时间
	 * @param amount
	 *            增加天数
	 * @return
	 */
	public static DateTime addDays(DateTime dt, int amount) {
		return dt.plusDays(amount);
	}

	/**
	 * 比较日期大小。还有其他的比较方法，详见 api
	 * 
	 * @param before
	 * @param dt
	 * @return before 早于 dt,true;否则 返回 false
	 */
	public static boolean isBefore(DateTime before, DateTime dt) {
		return before.isBefore(dt.getMillis());
	}

	public static boolean isInTimeRang(DateTime before, DateTime dt,
			DateTime after) {
		return dt.isAfter(before.getMillis()) && dt.isBefore(after.getMillis());
	}

	/**
	 * 比较两个日期的间隔
	 * 
	 * @param dt1
	 * @param dt2
	 * @return 相差毫秒数的绝对值
	 */
	public static long compareTo(DateTime dt1, DateTime dt2) {
		return Math.abs((dt1.getMillis() - dt2.getMillis()));
	}

	/**
	 * 返回预设 pattern 的当前日期字符串
	 * 
	 * @param parsePatterns
	 *            日期格式
	 * @return 当前日期字符串
	 */

	public static String getToday(String parsePatterns) {
		return DateFormatUtils.format(new Date(), parsePatterns);
	}

	/**
	 * 制定年份和月份，该月份最大的日期
	 * 
	 * @param yearStr
	 *            指定年份
	 * @param monthStr
	 *            制定月份
	 * @return
	 */
	public static int getMaxDayOfMonth(String yearStr, String monthStr) {
		return toDateTime(yearStr + monthStr, "yyyyMM").dayOfMonth()
				.getMaximumValue();
	}

	/**
	 * 
	 * @param data
	 *            待转换的时间
	 * @param timezone
	 *            时区代码，如： GMT+0,GMT+8
	 * @param pattern
	 *            时间模式
	 * @return 指定时区的日期
	 */
	public static String getTimeZoneTime(Date date, String timezone,
			String pattern) {
		TimeZone zone = TimeZone.getTimeZone(timezone);
		return DateFormatUtils.format(date, pattern, zone);
	}

	/**
	 * DateTime 转换为 Date
	 * 
	 * @param dt
	 * @return
	 */
	public static Date toDate(DateTime dt) {
		return dt.toDate();
	}

	/**
	 * DateTime 转换为 Calendar
	 * 
	 * @param dt
	 * @param locale
	 *            时区
	 * @return
	 */
	public static Calendar toCalendar(DateTime dt, Locale locale) {
		return dt.toCalendar(locale);
	}

	/**
	 * 演示各种 api 方法 ，在这里寻找是否有相应的方法
	 */
	private static void examples() {
		// 构造不同的 DateTime 之后，可以利用它得到各种指定的方法
		DateTime dt = new DateTime();

		System.out.println(" ====== 年  ====== ");
		System.out.println("当前年份：" + dt.getYear());
		System.out.println(" ====== 月  ====== ");
		System.out.println("当前月份：" + dt.getMonthOfYear());
		System.out.println("当前月份的最大日期 getMaximumValue ："
				+ dt.dayOfMonth().getMaximumValue());
		System.out.println("当前月份的最小日期 getMinimumValue："
				+ dt.dayOfMonth().getMinimumValue());
		System.out.println(" ====== 日  ====== ");
		System.out.println("当前日期 getDayOfYear ：" + dt.getDayOfYear());
		System.out.println("当前日期 getDayOfMonth ：" + dt.getDayOfMonth());
		System.out.println("当前日期 getDayOfWeek ：" + dt.getDayOfWeek());
		//指定日期格式
		System.out.println("当前日期 toString ："
				+ dt.toString("yyyy-MM-dd ", Locale.CHINA));
		// System.out.println("当前日期 dayOfWeek ：" + dt.mo);

		System.out.println(" ====== 星期  ====== ");
		System.out.println("当前星期 getWeekyear ：" + dt.getWeekyear());
		System.out.println("当前星期 getWeekOfWeekyear ：" + dt.getWeekOfWeekyear());

		System.out.println(" ====== 其他测试  ====== ");
		System.out.println("getMaxDayOfMonth 方法测试 ："
				+ MyDateUtils.getMaxDayOfMonth("2010", "14"));
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		MyDateUtils.examples();

	}

}
